package com.adt.ferreprob.dao.imp;

import java.util.Collection;
import java.util.Set;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.transaction.annotation.Transactional;

import com.adt.ferreprob.dao.IProveedorDao;
import com.adt.ferreprob.modelo.Factura;
import com.adt.ferreprob.modelo.Proveedor;

@Transactional
public class ProveedorDao implements IProveedorDao{
	
	private static Log log = LogFactory.getLog(ProveedorDao.class);
	private String className = ProveedorDao.class.getName();
	private EntityManager entityManager;
	
	@PersistenceContext
	public void setEntityManager(EntityManager entityManager) {
		this.entityManager = entityManager;
	}
	@Override
	public <T> boolean agregar(T objDominio) {
		
		log.info(className + ".agregar()");
		
		Proveedor proveedor = (Proveedor)objDominio;
		//Map<Integer, Factura> facturas = new HashMap<Integer, Factura>();
		Collection<Factura> facturas = proveedor.getFacturas();
		proveedor.setFacturas(null);

		try {
			
			entityManager.persist(proveedor);
			proveedor.setFacturas((Set<Factura>) facturas);
			entityManager.merge(proveedor);
			entityManager.flush();
			
		} catch (Exception e) {
			log.error("Error en funcion: " + className + ".agregar() - Mensaje de Error:" +  e.getMessage());
			return false;
		}
		return true;
	}

	@Override
	public <T> boolean editar(T objDominio) {
		log.info(className + ".editar() - " +  objDominio.getClass().getSimpleName());
		
		Proveedor proveedorEditado = (Proveedor)objDominio;
		
		try {
		
			Proveedor proveedor = (Proveedor) entityManager.find(Proveedor.class, proveedorEditado.getIdProveedor());
			
			proveedor.setDescripcion(proveedorEditado.getDescripcion());
			proveedor.setFacturas(proveedorEditado.getFacturas());
			proveedor.setNombre(proveedorEditado.getNombre());
			
			entityManager.merge(proveedor);
		
		} catch (Exception e) {
			log.error("Error en funcion: " + className + ".editar() - Mensaje de Error:" +  e.getMessage());
			return false;
		}
		return true;
	}

	@Override
	public <T> boolean borrar(T objDominio) {
		
		log.info(className + ".borrar()");

		try {
			
			Proveedor proveedor = entityManager.find(Proveedor.class, ((Proveedor)objDominio).getIdProveedor());
			entityManager.remove(proveedor);
			
		} catch (Exception e) {
			log.error("Error en funcion: " + className + ".borrar() - Mensaje de Error:" +  e.getMessage());
			return false;
		}
		
		return true;
	}

	@Override
	public <T> T obtener(Integer id) {
		// TODO Auto-generated method stub
		return null;
	}

}
